﻿using System.Diagnostics.Contracts;

namespace System.Linq.Reactive
{
    /// <summary>Обозреваемый объект</summary>
    /// <typeparam name="T">Тип объектов последовательности событий</typeparam>
    [ContractClass(typeof(ObservableExContract<>))]
    public interface IObservableEx<T>
    {
        /// <summary>Метод получения наблюдателя</summary>
        /// <returns>Наблюдатель объекта</returns>
        IObserverEx<T> GetObserver();
    }

    /// <summary>Класс контрактов для интерфейса <see cref="IObservableEx{T}"/></summary>
    /// <typeparam name="T">Тип объектов последовательности событий</typeparam>
    [ContractClassFor(typeof(IObservableEx<>))]
    class ObservableExContract<T> : IObservableEx<T>
    {
        /// <summary>Метод получения наблюдателя</summary>
        /// <returns>Наблюдатель объекта</returns>
        public IObserverEx<T> GetObserver()
        {
            Contract.Ensures(Contract.Result<IObserverEx<T>>() != null);
            return default(IObserverEx<T>);
        }

    }
}
